package org.i0o.webplus.support;

import java.util.ArrayList;
import java.util.List;

import org.i0o.webplus.exception.BaseUnCheckedException;

/**
 * 分页对象，包含分页数据及信息
 * 
 * @author <a href="mailto:781131@gmail.com">HTF</a>
 * @version 2010-5-14
 */
public class Page
	implements java.io.Serializable {

	private static final long serialVersionUID = -1864650855521260283L;

	/**
	 * 每页数据容量的默认：20
	 */
	private static final int DEFAULT_PAGE_SIZE = 20;

	private int pageSize;

	private long start;

	private long totalCount;

	private List<?> result;

	/**
	 * 构造方法，只构造空值
	 */
	public Page() {
		this(0, 0, DEFAULT_PAGE_SIZE, new ArrayList<Object>());
	}

	public Page(int pageSize) {
		this(0, 0, pageSize, new ArrayList<Object>());
	}

	/**
	 * 默认构造方法
	 * 
	 * @param start
	 *            本页数据在数据库中的起始位置
	 * @param totalCount
	 *            数据库中总记录条数
	 * @param pageSize
	 *            本页容量
	 * @param result
	 *            本页包含的数据
	 */
	public Page(long start, long totalCount, int pageSize, List<?> result) {
		if (pageSize <= 0 || start < 0 || totalCount < 0) {
			throw new BaseUnCheckedException("Illegal Arguments to Initiate Page Object");
		}
		this.start = start;
		this.totalCount = totalCount;
		this.pageSize = pageSize;
		this.result = result;
	}

	/**
	 * 获取数据总数
	 * 
	 * @return 数据总数
	 */
	public long getTotalCount() {
		return totalCount;
	}

	/**
	 * 设置数据总数
	 * 
	 * @param totalCount
	 *            数据总数
	 */
	public void setTotalCount(long totalCount) {
		this.totalCount = totalCount;
	}

	/**
	 * 获取当页数据集
	 * 
	 * @return 数据集
	 */
	public List<?> getResult() {
		return result;
	}

	/**
	 * 设置当页数据集
	 * 
	 * @param result
	 *            当页数据集
	 */
	public void setResult(List<?> result) {
		this.result = result;
	}

	/**
	 * 获取每页容量
	 * 
	 * @return
	 */
	public int getPageSize() {
		return pageSize;
	}

	/**
	 * 设置每页容量
	 * 
	 * @param pageSize
	 */
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	/**
	 * 获取当前页第一条数据在List中的位置,默认0
	 * 
	 * @return
	 */
	public long getStart() {
		return start;
	}

	/**
	 * 设置当前页第一条数据在List中的位置
	 * 
	 * @param start
	 */
	public void setStart(long start) {
		this.start = start;
	}

	/**
	 * 获取总页码
	 * 
	 * @return 总页码
	 */
	public long getTotalPageCount() {
		return totalCount % pageSize == 0 ? totalCount / pageSize : totalCount / pageSize + 1;
	}

	/**
	 * 取当前页码,页码默认1
	 * 
	 * @return 当前页码
	 */
	public long getCurrentPageNo() {
		return start / pageSize + 1;
	}

	/**
	 * 数据是否为空
	 * 
	 * @return 为空返回true, 否则返回false
	 */
	public boolean isEmpty() {
		return result == null || result.isEmpty();
	}

	/**
	 * 获取任一页第一条数据在整个结果中的位置（每页数据容量使用默认）
	 * 
	 * @param pageNo
	 *            页码，从1开始
	 * @return 位置序号（从0开始）
	 */
	protected static int getStartOfPage(int pageNo) {
		return getStartOfPage(pageNo, DEFAULT_PAGE_SIZE);
	}

	/**
	 * 获取任一页第一条数据在整个结果中的位置（每页数据容量使用指定）
	 * 
	 * @param pageNo
	 *            页码，从1开始
	 * @param pageSize
	 *            页面数据容量
	 * @return 位置序号（从0开始）
	 */
	public static int getStartOfPage(int pageNo, int pageSize) {
		return (pageNo - 1) * pageSize;
	}
}
